//
//  StatusCell.swift
//  01-微博项目搭建
//
//  Created by Adolph on 15/5/19.
//  Copyright (c) 2015年 Adolph. All rights reserved.
//

import UIKit
import SDWebImage

///微博 cell 的代理
protocol StatusCellDelegate: NSObjectProtocol {
  /// 处理选中 cell 的图片
    /**
     1 选中的cell 
     2 选中的照片 cell
     3 选中的照片索引
    */
    func statusCellDidSelectedPicture(cell: StatusCell, pictureCell: PictureCell, index: Int)
}


class StatusCell: UITableViewCell {
    ///处理StatusCell的自定义代理
    weak var delegatePicture: StatusCellDelegate?
    ///头像
    @IBOutlet weak var iconView: UIImageView!
    ///昵称
    @IBOutlet weak var nameLabel: UILabel!
    ///会员图标
    @IBOutlet weak var memberIcon: UIImageView!
    
    ///认证图标
    @IBOutlet weak var vipIcon: UIImageView!
    
    ///发布时间
    @IBOutlet weak var timeLable: UILabel!
    ///来源
    @IBOutlet weak var sourceLabel: UILabel!
    ///正文
    @IBOutlet weak var contentLabel: UILabel!
    

    ///colltionView高的约束
    @IBOutlet weak var pictureViewHIGHT: NSLayoutConstraint!
    ///colltionView 宽的约束
    @IBOutlet weak var pictureViewWidth: NSLayoutConstraint!
   
    
    @IBOutlet weak var pictureViewLayout: UICollectionViewFlowLayout!
    ///底部视图View
    @IBOutlet weak var bottomView: UIView!
   
    ///转发微博的文本
    @IBOutlet weak var pictureView: UICollectionView!
    
    @IBOutlet weak var forwardLabel: UILabel!
    //微博数据
    var status: Status? {
        didSet {
          nameLabel.text = status?.user?.name
          timeLable.text = status?.created_at
          sourceLabel.text = status?.source
          contentLabel.text = status?.text
          
           
           //设置头像
            iconView.sd_setImageWithURL(status?.user?.iconURL)
            //设置图标
           memberIcon.image = status?.user?.memberImage
           vipIcon.image = status?.user?.VipImage
            //计算配图大小
            let pSize =  calcPictureViewSize(status!)
            pictureViewWidth.constant = pSize.viewSize.width
            pictureViewHIGHT.constant = pSize.viewSize.height
            //设置 layout 的大小
            pictureViewLayout.itemSize = pSize.itemSize
            
            // 让 collectionView 刷新数据
            pictureView.reloadData()
            
            //判断是否是转发微博
            forwardLabel?.text = (status?.retweeted_status?.user?.name ?? "") + ":" + (status?.retweeted_status?.text ?? "")
            
        }
    
    }
    
    ///返回colltionViewCell的可重用表示符号
    class func cellIdentifier(status: Status) ->String {
        if status.retweeted_status != nil {
          return "ForwardCell"
        }
        return "StatusCell"
    
    }
    
    ///根据微博数据，计算行高
    func rowHight(status: Status) -> CGFloat {
       // 1. 设置微博数据
        self.status = status
        
        //2. 强制给更新自动布局
        layoutIfNeeded()
        
        // 3. 返回底部视图的最大高度
        return CGRectGetMaxY(bottomView.frame)
    
    }
    /**
    计算图像视图的大小
    
    1> 没有图像，CGRectZero
    2> 一张图片，图像的原始尺寸
    3> 4张图片，固定大小的 2 * 2
    4> 多张图片，固定大小的 3 * 3
    
    元组->可以包含多个值
    */
    private func calcPictureViewSize(status: Status) -> (viewSize: CGSize, itemSize: CGSize) {
     // 单张图片默认大小
        let s: CGFloat = 90
        let itemSize = CGSizeMake(s, s)
        //图片间距
        let m: CGFloat = 10
        //图片的数量
        let imageCount = status.pictureURLs?.count ?? 0
        
        //1.没有图像
        if imageCount == 0 {
          return (CGSizeZero, itemSize)
        }
        
        
        // 2. 一张图像
        if imageCount == 1 {
            // 利用 sdwebimage 从缓存加载图像
            // 缓存图像的 key 是 图像的 URL，注意：不是保存在磁盘中的图片名
            // 保存的文件名，是 URL 的 MD5
            let key = status.pictureURLs![0].absoluteString
            
            let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(key)

//            println("单张图片 \(image.size)")
            return (image.size, image.size)
        
        }
      //3. 四张图片
        if imageCount == 4 {
//         println("四张图片")
        return (CGSizeMake(s * 2 + m, s * 2 + m), itemSize)
        }
        
        //4.执行到此， 就是除了上述几种情况了
          //4.1 计算行数
        /**
        1, 2, 3 => 1
        4, 5, 6 => 2
        */
        
//        println("多张图片 \(imageCount)")
        let row = CGFloat((imageCount - 1) / 3 + 1)
        return (CGSizeMake(s * 3 + m * 2, row * s + (row - 1) * m), itemSize)
     }
    
    
    
    
    override func awakeFromNib() {
        super.awakeFromNib()
        contentLabel.preferredMaxLayoutWidth = UIScreen.mainScreen().bounds.width - 20
        forwardLabel?.preferredMaxLayoutWidth = UIScreen.mainScreen().bounds.width - 20
        
    }
    
    
}

    extension StatusCell: UICollectionViewDataSource, UICollectionViewDelegate{
    // MARK - 实现配图的数据源方法
    //根据行数，显示配图数量
        func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
           
            println("---\(status)")
            
            return status?.pictureURLs?.count ?? 0
        }
        
        func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
            
            let cell = collectionView.dequeueReusableCellWithReuseIdentifier("StatusCollectionCell", forIndexPath: indexPath) as! PictureCell
           cell.url = status?.pictureURLs![indexPath.item]
            return cell
        }
        
        /**
        控制器需要什么样的数据？
        1. 选择照片的序号 － index Path
        2. 当前照片所在的 cell - self
        3. 当前 cell 的照片大图数组 - cell.status.属性已经具备
        */
        func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
           
            println("选中 \(indexPath) \(status?.picSelectURLs)")
            
            //取得当前用户选中的照片
            let pictureCell = collectionView.cellForItemAtIndexPath(indexPath) as! PictureCell
            delegatePicture?.statusCellDidSelectedPicture(self, pictureCell: pictureCell, index: indexPath.item)
            
        }
        
}
    

///配图视图 cell 
class PictureCell: UICollectionViewCell {
  
    @IBOutlet weak var iconView: UIImageView!
    var url: NSURL? {
        didSet {
           iconView.sd_setImageWithURL(url)
        }
    
    }
}

    
    
    

